""" Initialize database with preset data. """

from django.db.models import Model
from user.models import Permission, User, Role, Empower
from project.models import ProjectPermission
from department.models import DepartmentPermission

record_example = {
    'id': 1,
    'name': 'Monkeyhbd',
    'website': 'www.monkeyhbd.com'
}


def sub_dict(keys, dic):
    d = {}
    for key in keys:
        d[key] = dic[key]
    return d


def install_records(model, records, match, update, exist='overwrite'):
    """ 在 model 表中导入预设的 records ，
    使用 match 列表中的参数尝试匹配已经存在的记录，
    使用 update 列表中的参数更新或创建记录，
    当 match 匹配到已经存在的记录时，执行 exist 指定的行为，overwrite | ignore """
    assert issubclass(model, Model)
    for record in records:
        match_argv = sub_dict(match, record)
        update_argv = sub_dict(update, record)
        model_query = model.objects.filter(**match_argv)
        if len(model_query) > 0:  # Exist.
            if exist == 'overwrite':
                model_query.update(**update_argv)
                print('(UPDATE)', model._meta.db_table, list(record.values()))
            if exist == 'ignore':
                print('(IGNORE)', model._meta.db_table, list(record.values()))
        else:  # Not exist.
            model.objects.create(**update_argv)
            print('(CREATE)', model._meta.db_table, list(record.values()))


def execute(argv):
    print(argv)
    # 导入预设的 [E4-权限]
    install_records(Permission, [
        {'id': 1, 'name': '所有权限', 'detail': '授予用户所有权限'},
        {'id': 2, 'name': '登录', 'detail': '允许用户登录'},
        {'id': 3, 'name': '创建用户', 'detail': '允许用户创建用户'},
        {'id': 4, 'name': '创建项目', 'detail': '允许用户创建项目'},
        {'id': 5, 'name': '修改自身', 'detail': '允许用户修改自身信息'},
        {'id': 6, 'name': '修改用户', 'detail': '允许用户修改任意用户信息'},
        {'id': 7, 'name': '删除自身', 'detail': '允许用户注销自身账号'},
        {'id': 8, 'name': '删除用户', 'detail': '允许用户删除任意用户账号'},
        {'id': 9, 'name': '创建技术', 'detail': '允许用户创建技术'},
        {'id': 10, 'name': '修改技术', 'detail': '允许用户修改技术'},
        {'id': 11, 'name': '删除技术', 'detail': '允许用户删除技术'},
        {'id': 12, 'name': '修改身份', 'detail': '允许用户添加、删除或者修改系统身份'},
        {'id': 13, 'name': '创建部门', 'detail': '允许用户创建部门'},
        {'id': 14, 'name': '删除部门', 'detail': '允许用户删除部门'},
        {'id': 15, 'name': '修改系统邮件', 'detail': '允许用户增加、删除、修改由自己发送的系统邮件'},
        {'id': 16, 'name': '删除系统邮件', 'detail': '允许用户删除、查看任意系统邮件'},
        {'id': 17, 'name': '修改系统公告', 'detail': '允许用户增加、删除、修改由自己发送的系统公告'},
        {'id': 18, 'name': '删除系统公告', 'detail': '允许用户删除任意系统公告'},
    ], ['id'], ['id', 'name', 'detail'])
    # 创建 root 身份和 ROOT 用户，授予 root 身份 [1-所有权限]
    install_records(Role, [
        {'id': 1, 'name': 'root'}
    ], ['id'], ['id', 'name'], exist='ignore')
    install_records(User, [
        {
            'id': 10000,
            'name': 'ROOT',
            'password': '25f9e794323b453885f5181f1b624d0b',
            'rid_id': 1
        }
    ], ['id'], ['id', 'name', 'password', 'rid_id'], exist='ignore')
    install_records(Empower, [
        {'rid_id': 1, 'pid_id': 1}
    ], ['rid_id', 'pid_id'], ['rid_id', 'pid_id'], exist='ignore')
    # 导入预设的 [E8-项目权限]
    install_records(ProjectPermission, [
        {'id': 1, 'name': '所有权限', 'detail': '授予用户所有项目权限'},
        {'id': 2, 'name': '修改项目信息', 'detail': '允许用户修改项目信息'},
        {'id': 3, 'name': '修改项目成员', 'detail': '允许用户增加、删除、修改项目成员'},
        {'id': 4, 'name': '设置项目身份', 'detail': '允许用户删除、修改或者定义新的项目身份'},
        {'id': 5, 'name': '删除项目', 'detail': '允许用户删除项目'},
        {'id': 6, 'name': '修改项目邮件', 'detail': '允许用户增加、删除、修改由自己发送的项目邮件'},
        {'id': 7, 'name': '删除项目邮件', 'detail': '允许用户删除、查看任意项目邮件'},
        {'id': 8, 'name': '修改项目公告', 'detail': '允许用户增加、删除、修改由自己发送的项目公告'},
        {'id': 9, 'name': '删除项目公告', 'detail': '允许用户删除任意项目公告'},
    ], ['id'], ['id', 'name', 'detail'])
    # 导入预设的 [E12-部门权限]
    install_records(DepartmentPermission, [
        {'id': 1, 'name': '所有权限', 'detail': '授予用户所有部门权限'},
        {'id': 2, 'name': '修改部门信息', 'detail': '允许用户修改部门信息'},
        {'id': 3, 'name': '修改部门成员', 'detail': '允许用户增加、删除、修改部门成员'},
        {'id': 4, 'name': '修改部门邮件', 'detail': '允许用户增加、删除、修改由自己发送的部门邮件'},
        {'id': 5, 'name': '删除部门邮件', 'detail': '允许用户删除、查看任意部门邮件'},
        {'id': 6, 'name': '修改部门公告', 'detail': '允许用户增加、删除、修改由自己发送的部门公告'},
        {'id': 7, 'name': '删除部门公告', 'detail': '允许用户删除任意部门公告'},
    ], ['id'], ['id', 'name', 'detail'])
